op {
  graph_op_name: "RaggedTensorFromVariant"
  visibility: HIDDEN
  in_arg {
    name: "encoded_ragged"
    description: <<END
A `variant` Tensor containing encoded `RaggedTensor`s.
END
  }
  out_arg {
    name: "output_nested_splits"
    description: <<END
A list of one or more Tensors representing the splits of the output
`RaggedTensor`.
END
  }
  out_arg {
    name: "output_dense_values"
    description: <<END
A Tensor representing the values of the output `RaggedTensor`.
END
  }
  attr {
    name: "input_ragged_rank"
    description: <<END
The ragged rank of each encoded `RaggedTensor` component in the input. If set to
-1, this is inferred as `output_ragged_rank` - `rank(encoded_ragged)`
END
  }
  attr {
    name: "output_ragged_rank"
    description: <<END
The expected ragged rank of the output `RaggedTensor`. The following must hold:
`output_ragged_rank = rank(encoded_ragged) + input_ragged_rank`.
END
  }
  summary: <<END
Decodes a `variant` Tensor into a `RaggedTensor`.
END
  description: <<END
Decodes the given `variant` Tensor and returns a `RaggedTensor`. The input
could be a scalar, meaning it encodes a single `RaggedTensor` with ragged_rank
`output_ragged_rank`. It could also have an arbitrary rank, in which case each
element is decoded into a `RaggedTensor` with ragged_rank `input_ragged_rank`
and these are then stacked according to the input shape to output a single
`RaggedTensor` with ragged_rank `output_ragged_rank`. Each `variant` element in
the input Tensor is decoded by retrieving from the element a 1-D `variant`
Tensor with `input_ragged_rank + 1` Tensors, corresponding to the splits and
values of the decoded `RaggedTensor`. If `input_ragged_rank` is -1, then it is
inferred as `output_ragged_rank` - `rank(encoded_ragged)`. See
`RaggedTensorToVariant` for the corresponding encoding logic.

END
}
